package com.autumn.util.excel;

import com.autumn.util.StringUtils;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
 * 手动 java bean 参数验证 简介: JSR 303是JAVA EE 6中的一项子规范，Bean Validation 为 JavaBean
 * 验证定义了相应的 元数据模型和 API。缺省的元数据是 Java Annotations，支持诸如
 *
 * @NotNull ，@NotBlank，@AssertTrue，@Size(min=, max=)等注解，若采用自定义或其他验证器，
 * 也可以扩展自定义的验证注解
 */
public class Jsr303Util {

    /**
     * 获取验证器
     */
    private static final Validator VALIDATOR = Validation.buildDefaultValidatorFactory().getValidator();

    /**
     * 采用默认验证器，验证普通java bean
     *
     * @param obj
     */
    public static <T> String validateBean(T obj) {
        return validateBean(obj, VALIDATOR);
    }

    /**
     * 验证普通java bean, 返回字符串不为null，就说明有错
     *
     * @param obj
     * @param validators 参数验证器
     * @return
     */
    public static <T> String validateBean(T obj, Validator validators) {
        if (null == obj) {
            return null;
        }
        if (validators == null) {
            validators = VALIDATOR;
        }
        return parseValidateSet(validators.validate(obj));
    }

    /**
     * 采用默认验证器，验证List集合里的元素
     *
     * @param obj
     */
    public static <T> String validateList(List<T> obj) {
        return validateList(obj, VALIDATOR);
    }

    /**
     * 验证List集合里的元素，若其中一个元素验证时候出错，就返回，返回字符串不为null，就说明有错
     *
     * @param obj
     * @param validators
     * @param <T>
     * @return
     */
    public static <T> String validateList(List<T> obj, Validator validators) {
        if (obj == null) {
            return null;
        }
        if (validators == null) {
            validators = VALIDATOR;
        }
        Iterator<T> iterator = obj.iterator();
        while (iterator.hasNext()) {
            T item = iterator.next();
            String result = parseValidateSet(validators.validate(item));
            if (result != null) {
                return result;
            }
        }
        return null;
    }

    /**
     * 解析验证返回的结果集
     *
     * @param resultSet 结果集
     */
    private static <T> String parseValidateSet(Set<ConstraintViolation<T>> resultSet) {
        StringBuilder sBuilder = new StringBuilder();
        if (resultSet != null && resultSet.size() > 0) {
            for (ConstraintViolation<T> constraint : resultSet) {
                String message = constraint.getMessage();
                if (!StringUtils.isNullOrBlank(message)) {
                    sBuilder.append(message).append("，");
                } else {
                    sBuilder.append(constraint.getPropertyPath().toString()).append("不合法、");
                }
            }
        }
        return sBuilder.length() == 0 ? null : sBuilder.toString();
    }
}
